
package ChatNI;

import ChatController.ChatController;
import ChatController.Model;
import ChatController.TypeOfNotify;
import common.Message;
import java.net.InetAddress;
import java.util.Observable;
import java.util.Observer;


/**
 *
 * @author Marion et Nicolas
 */


public class ChatNI implements Observer{
    
    /**
     * Numéro de port d'écoute tcp
     */
    protected static final int numPortTCPecoute = 5555;
    /**
     *  Numéro de port d'écoute udp
     */
    protected static final int numPortUDPecoute = 6666;
     
    /**
     * Addresse de destination IP
     */
    protected static InetAddress adrDestination;
    /**
     * Numéro de port destination
     */
    protected static int portDestination;
    /**
     * Numéro de port source
     */
    protected static int portSource;
    
    /**
     * Booléen qui indique si on est en train d'écouter
     */
    protected static boolean listening = true;
    private UDPecoute sockUDPecoute;
    private TCPecoute sockTCPecoute;
    private UDPCom udpcom;
    private TCPCom tcpcom;
    /**
     * Liaison avec le ChatController
     */
    protected static ChatController control;
    private static Model modele;
    
   /**
     * Constructeur servant à créer les constructeurs UDPCom et UDPecoute notamment
     */
    public ChatNI(){}
    
       /**
     * Constructeur principal du ChatNI pour UDP
     * @param listenerUDP
     * @param senderUDP 
     */
    public ChatNI(UDPecoute listenerUDP, UDPCom senderUDP){
        this.sockUDPecoute = listenerUDP;
        this.udpcom = senderUDP;
        ChatNI.listening=true;
    }
    
      /**
     * Constructeur principal du ChatNI pour TCP
     * @param listenerTCP
     * @param clientTCP 
     */
    public ChatNI(TCPecoute listenerTCP, TCPCom clientTCP){
        this.sockTCPecoute = listenerTCP;
        this.tcpcom = clientTCP;
    }
    
     /**
     * Liaison d'un Model avec le ChatNI
     * Le ChatNI sera un Observer du Model
     * @param m 
     */
    public void setModel(Model m){
        this.modele=m;
        modele.addObserver(this);
    }
        
      /**
     * Liaison d'un Chatcontroller avec le ChatNI
     * @param controller 
     */
    public void setController(ChatController controller){
        this.control=controller;
    }
    
      /**
     * Envoi d'un message sur le réseau via UDP
     * @param message
     * @param dest 
     */
    public void sendViaUDP(Message message, InetAddress dest){
        adrDestination=dest;                // On prend l'addresse IP de destination
        udpcom = new UDPCom(portSource,6666,dest);
        udpcom.sendMessage(message);    
    }
    
      /**
     * Envoi d'un message sur le réseau via TCP
     * @param message 
     */
    public void sendViaTCP(Message message){
        tcpcom.sendMessage(message);
    }
    
/**
 * Méthode de l'interface Observer
 * Sur changement d'état du Model, le NI se met à jour
 * @param o
 * @param arg 
 */
        @Override
    public void update(Observable o, Object arg) {
        if (arg instanceof TypeOfNotify){
            TypeOfNotify type = (TypeOfNotify)arg;
            String connected = type.getConnected();   
            String disconnected = type.getDisconnected();
            if (connected != null){
                    if (ChatNI.listening == false){  // Petite bidouille pour la reconnection.. Sinon ça ne fonctionne pas
                            control.sendReconnexion();
                            ChatNI.listening=true;
                            sockUDPecoute.start();
                            System.out.println("Je suis connecte, j'ecoute le reseau..");
                    }
                    else{                           // Cas de la premiere connection
                        ChatNI.listening=true;
                        sockUDPecoute.start();
                        System.out.println("Je suis connecte, j'ecoute le reseau..");
                    }
            } 
            else if (disconnected != null){
                    ChatNI.listening = false;
                    System.out.println("Je suis deconnecte");
            }
          }
        }
}
    
